/**
 * 
 */
package fr.toussna.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.core.RowMapper;

import fr.toussna.entity.DomainEntity;
import fr.toussna.entity.Member;

/**
 * Cette classe est une spécialisation de la classe {@link AbstractDAO}, elle
 * implémente toutes les méthodes abstraite de la classe mère. Elle spécifie les
 * requêtes Sql pour l'entité {@link Member} et rajoutes des méthodes adaptées
 * a la classe Member.
 * 
 * C'est dans cette classe qu'on implémente les algorithmes pour compléter le
 * design pattern Template. On utilise le {@link RowMapper} de Spring JDBC pour
 * simplifier le Mapping objet relationnel.
 * 
 * @author My
 * @version 2.0
 * 
 */

public class MemberDAO extends AbstractDAO {

	private static final Log	LOGGER	= LogFactory.getLog(MemberDAO.class
	                                            .getName());

	// **********************************
	// * Attributs *
	// **********************************

	/**
	 * Nom de la table dans la base
	 */
	private static final String	TABLE	= "MEMBER";

	/**
	 * Colonne de la table dans la base
	 */
	private static final String	COLUMNS	= "EMAIL, PASSWORD,CIVILITY,NAME,FIRSTNAME,BIRTHDATE,ADDRESS";

	// **************************************
	// * Methodes specialles a cette classe *
	// **************************************

	/**
	 * Cette méthode est spécifique aux entités membres, elle permet de
	 * sélectionner les membres dont le nom est proche du mot en paramètre.
	 * 
	 * @param name
	 *            Le nom du membre
	 * @return La liste des membres de meme nom
	 */
	public List<DomainEntity> selectByName(String name) {
		List<DomainEntity> list = super.selectByKey(name);
		return list;
	}

	// **********************************
	// * Methodes heritees *
	// **********************************
	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.toussna.dao.AbstractDAO#getSelectSqlStatement()
	 */
	@Override
	protected String getSelectSqlStatement() {
		String sql = "SELECT * FROM " + TABLE + " WHERE ID= ?";
		return sql;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.toussna.dao.AbstractDAO#getInsertSqlStatement()
	 */
	@Override
	protected String getInsertSqlStatement() {
		String sql = "INSERT INTO " + TABLE + " (" + COLUMNS
		        + ") VALUES (?,?,?,?,?,?,?)";
		return sql;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.toussna.dao.AbstractDAO#getUpdateSqlStatement()
	 */
	@Override
	protected String getUpdateSqlStatement() {
		// EMAIL, PASSWORD,CIVILITY,NAME,FIRSTNAME,BIRTHDATE,ADDRESS
		String sql = "UPDATE "
		        + TABLE
		        + " SET EMAIL= ?, PASSWORD= ?,CIVILITY= ?,NAME= ?,FIRSTNAME= ?,BIRTHDATE= ? ,ADDRESS= ?  WHERE ID= ?";
		return sql;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.toussna.dao.AbstractDAO#getDeleteSqlStatement()
	 */
	@Override
	protected String getDeleteSqlStatement() {
		String sql = "DELETE FROM " + TABLE + " WHERE ID= ?";
		return sql;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.toussna.dao.AbstractDAO#getSelectAllSqlStatement()
	 */
	@Override
	protected String getSelectAllSqlStatement() {
		String sql = "SELECT * FROM " + TABLE;
		return sql;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.toussna.dao.AbstractDAO#getSelectByKeySqlStatement()
	 */
	@Override
	protected String getSelectByKeySqlStatement(String key) {
		String sql = "SELECT * FROM  " + TABLE + " WHERE EMAIL LIKE '%" + key
		        + "%' or NAME LIKE '%" + key
		        + "%' or FIRSTNAME LIKE '%" + key + "%'";
		return sql;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.toussna.dao.AbstractDAO#getDomainEntityRowMapper()
	 */
	@Override
	protected RowMapper<DomainEntity> getDomainEntityRowMapper() {

		return new RowMapper<DomainEntity>() {

			@Override
			public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
				Member member = new Member();
				// EMAIL, PASSWORD,CIVILITY,NAME,FIRSTNAME,BIRTHDATE,ADDRESS
				member.setId(rs.getLong("id"));
				member.setEmail(rs.getString("email"));
				member.setPassword(rs.getString("password"));
				member.setCivility(rs.getString("civility"));
				member.setName(rs.getString("name"));
				member.setFirstName(rs.getString("firstname"));
				member.setBirthDay(rs.getString("birthdate"));
				member.setAddress(rs.getString("address"));

				if (LOGGER.isDebugEnabled()) {
					LOGGER.debug("Mapped data to entity: " + member.toString());
				}

				return member;
			}
		};
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.toussna.dao.AbstractDAO#getDomainEntityData(fr.toussna.entity.DomainEntity
	 * )
	 */
	@Override
	protected Object[] getDomainEntityData(DomainEntity entity) {
		Member member = (Member) entity;
		// EMAIL, PASSWORD,CIVILITY,NAME,FIRSTNAME,BIRTHDATE,ADDRESS
		if (member.getId() > 0) {
			Object[] obj = new Object[] { member.getEmail(),
			        member.getPassword(), member.getCivility(),
			        member.getName(), member.getFirstName(),
			        member.getBirthDay(), member.getAddress(), member.getId() };
			if (LOGGER.isDebugEnabled()) {
				LOGGER.debug("Mapped entity to row data: "
				        + Arrays.toString(obj));
			}
			return obj;
		} else {
			Object[] obj = new Object[] { member.getEmail(),
			        member.getPassword(), member.getCivility(),
			        member.getName(), member.getFirstName(),
			        member.getBirthDay(), member.getAddress() };
			if (LOGGER.isDebugEnabled()) {
				LOGGER.debug("Mapped entity to row data: "
				        + Arrays.toString(obj));
			}
			return obj;
		}
	}

}
